#ifndef __NIGHT_SKY_SERVER_H
#define __NIGHT_SKY_SERVER_H

namespace wsgi {
  class Middleware;
}

namespace night_sky
{
  /**
   * サーバのインタフェースクラス．
   * 
   * @author krdlab
   */
  class Server
  {
  public:
    /** サーバの処理結果を表す． */
    enum Status
    {
      /** 成功 */
      SUCCESS,

      /** 失敗 */
      FAILURE,
    };
  public:
    virtual ~Server() {}

    /**
     * サーバを起動する．
     * 
     * @param port
     *         ポート番号
     * @return 処理結果に応じて {@link Server::Status} を返す．
     */
    virtual Status start(const int port) = 0;

    /**
     * サーバを起動する．
     * ポート番号の解決は実装に依存する．
     * 
     * @return 処理結果に応じて {@link Server::Status} を返す．
     */
    virtual Status start() = 0;

    /**
     * サーバを停止する．
     * 
     * @return 処理結果に応じて {@link Server::Status} を返す．
     */
    virtual Status stop() = 0;
  };

  /** 参照用の前方宣言 */
  class Logger;
  class ServerSocket;
  class AcceptedSocket;

  /**
   * デフォルトサーバ．
   * 
   * @author krdlab
   */
  class DefaultServer : public Server
  {
  private:
    Logger& logger;
    int     m_port;
    bool    m_isStopped;

    wsgi::Middleware* m_pMiddleware;

  private:
    ServerSocket* createServerSocket(const int port) const;
    void doAccept(const ServerSocket& socket) const;
    void loop_send_recv(const AcceptedSocket& socket) const;

    DefaultServer(const DefaultServer&);
    DefaultServer& operator=(const DefaultServer&);

  protected:
    bool isStopped() const { return this->m_isStopped; }

  public:
    explicit DefaultServer(const int port = -1, wsgi::Middleware* ware = NULL);
    virtual ~DefaultServer();

    virtual Status start(const int port);
    virtual Status start();
    virtual Status stop();
  };
}

#endif
